package com.example.feign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 3.ribbon和feign两个的区别和选择
 * 目前，在Spring cloud 中服务之间通过restful方式调用有两种方式
 * - restTemplate+Ribbon
 * - feign
 * 相同点:
 * 　　：ribbon和feign都是实现软负载均衡调用
 * 不同点:
 * ribbon：
 * 是一个基于 HTTP 和 TCP 客户端的负载均衡器
 * 它可以在客户端配置 ribbonServerList（服务端列表），然后默认以轮询请求以策略实现均衡负载，
 * 他是使用可以用restTemplate+Ribbon 使用
 * feign:
 * Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的，
 * 所以可以用 Apache 的 HttpClient ，而 Feign 是一个使用起来更加方便的 HTTP 客戶端，
 * 使用起来就像是调用自身工程的方法，而感觉不到是调用远程方法
 * 选择
 * 选择feign
 * 默认集成了ribbon
 * 写起来更加思路清晰和方便
 * 采用注解方式进行配置，配置熔断等方式方便
 */


@SpringBootApplication

@EnableEurekaClient

//@EnableCircuitBreaker

//@ServletComponentScan
@EnableFeignClients
public class FeignApplication {

    /**
     * 如果使用
     * //服务的生成者（被调用者）在注册中心注册的名字
     * @FeignClient(name = "SERVICE-PROVIDER")  用(value="SERVICE-PROVIDER")错
     * public interface GitHubApiClient
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }


    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

}
